Restore your credentials from GitHub
工作流概述
这是一个包含11个节点的复杂工作流,主要用于自动化处理各种任务。
工作流源代码
{
"id": "7zRCNv7B5WFRg7ux",
"meta": {
"instanceId": "e634e668fe1fc93a75c4f2a7fc0dad807ca318b79654157eadb9578496acbc76"
},
"name": "Restore your credentials from GitHub",
"tags": [
{
"id": "2RWIfLUVCa0bnmGX",
"name": "N8n",
"createdAt": "2025-03-06T09:58:39.214Z",
"updatedAt": "2025-03-06T09:58:39.214Z"
}
],
"nodes": [
{
"id": "f8aff38c-3e40-4820-b8f5-50e3e1f878c8",
"name": "When clicking ‘Test workflow’",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-640,
-120
],
"parameters": {},
"typeVersion": 1
},
{
"id": "f838e0c6-36aa-4c0b-bdd2-ef096ffd3d1d",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1020,
-140
],
"parameters": {
"width": 320,
"height": 420,
"content": "## Restore from GitHub
This workflow will restore all instance credentials from GitHub backups.
### Setup
Open `Globals` node and update the values below 👇
- **repo.owner:** your Github username
- **repo.name:** the name of your repository
- **repo.path:** the folder to use within the repository.
If your username was `john-doe` and your repository was called `n8n-backups` and you wanted the credentials to go into a `credentials` folder you would set:
- repo.owner - john-doe
- repo.name - n8n-backups
- repo.path - credentials/
"
},
"typeVersion": 1
},
{
"id": "8f59b7b0-ea9d-4209-8c6b-d48fe9d8cf7b",
"name": "Globals",
"type": "n8n-nodes-base.set",
"position": [
-380,
-120
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6cf546c5-5737-4dbd-851b-17d68e0a3780",
"name": "repo.owner",
"type": "string",
"value": "BeyondspaceStudio"
},
{
"id": "452efa28-2dc6-4ea3-a7a2-c35d100d0382",
"name": "repo.name",
"type": "string",
"value": "n8n-backup"
},
{
"id": "81c4dc54-86bf-4432-a23f-22c7ea831e74",
"name": "repo.path",
"type": "string",
"value": "credentials"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "d72bf1a6-f3a0-4dc0-afc0-e39c7e8b16f3",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-440,
-240
],
"parameters": {
"color": 4,
"width": 150,
"height": 80,
"content": "## Edit this node 👇"
},
"typeVersion": 1
},
{
"id": "4eeb0ed5-7e90-4f09-8296-04c0349de49b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
100,
20
],
"parameters": {
"color": 4,
"content": "## Skip credential
- The empty json files
- The n8n account api
- ...edit this node at will"
},
"typeVersion": 1
},
{
"id": "40856ade-3ff7-43ef-8c45-ec5a126a5787",
"name": "Get all files in given path",
"type": "n8n-nodes-base.httpRequest",
"position": [
-160,
-120
],
"parameters": {
"url": "=https://api.github.com/repos/{{ $json.repo.owner }}/{{ $json.repo.name }}/contents/{{ $json.repo.path }}",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"id": "3FYHiPFtycAFT8V0",
"name": "GitHub account"
}
},
"typeVersion": 4.2
},
{
"id": "4284aadd-4840-4754-9416-6bb74a1df192",
"name": "Split the result",
"type": "n8n-nodes-base.splitOut",
"position": [
-600,
200
],
"parameters": {
"options": {},
"fieldToSplitOut": "path"
},
"typeVersion": 1
},
{
"id": "48a04e72-5f9e-4dc3-863d-a8bb30f1c8c2",
"name": "Get file content from GitHub",
"type": "n8n-nodes-base.github",
"position": [
-360,
200
],
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "BeyondspaceStudio"
},
"filePath": "={{ $('Get all files in given path').item.json.path }}",
"resource": "file",
"operation": "get",
"repository": {
"__rl": true,
"mode": "name",
"value": "n8n-backup"
},
"additionalParameters": {}
},
"credentials": {
"githubApi": {
"id": "3FYHiPFtycAFT8V0",
"name": "GitHub account"
}
},
"typeVersion": 1,
"alwaysOutputData": true
},
{
"id": "507c8514-6acf-4568-83cc-bb07f06e6a96",
"name": "Convert files to JSON",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-140,
200
],
"parameters": {
"options": {},
"operation": "fromJson"
},
"typeVersion": 1
},
{
"id": "084e7306-4c7b-4a9b-8f3e-f844ab340f6a",
"name": "Restore n8n Credentials",
"type": "n8n-nodes-base.n8n",
"position": [
380,
200
],
"parameters": {
"data": "={{ JSON.stringify($json.data.data) }}",
"name": "={{ $json.data.name }}",
"resource": "credential",
"requestOptions": {},
"credentialTypeName": "={{ $json.data.type }}"
},
"credentials": {
"n8nApi": {
"id": "dzYjDgtEXtpRPKhe",
"name": "n8n account"
}
},
"typeVersion": 1
},
{
"id": "f8267df1-eb0a-491e-bed4-01480583a535",
"name": "Check for skipped Credentials",
"type": "n8n-nodes-base.if",
"position": [
100,
200
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "ad031296-4ac0-4087-bc35-7975a2cc25e6",
"operator": {
"type": "object",
"operation": "empty",
"singleValue": true
},
"leftValue": "={{ $json.data }}",
"rightValue": ""
},
{
"id": "ca912a57-6a4b-4b9a-be0e-37b69d3e4917",
"operator": {
"type": "string",
"operation": "contains"
},
"leftValue": "={{ $json.data.name }}",
"rightValue": "n8n account"
}
]
}
},
"typeVersion": 2.2
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "8a89a054-697f-4705-89a8-5d3288936206",
"connections": {
"Globals": {
"main": [
[
{
"node": "Get all files in given path",
"type": "main",
"index": 0
}
]
]
},
"Split the result": {
"main": [
[
{
"node": "Get file content from GitHub",
"type": "main",
"index": 0
}
]
]
},
"Convert files to JSON": {
"main": [
[
{
"node": "Check for skipped Credentials",
"type": "main",
"index": 0
}
]
]
},
"Get all files in given path": {
"main": [
[
{
"node": "Split the result",
"type": "main",
"index": 0
}
]
]
},
"Get file content from GitHub": {
"main": [
[
{
"node": "Convert files to JSON",
"type": "main",
"index": 0
}
]
]
},
"Check for skipped Credentials": {
"main": [
[],
[
{
"node": "Restore n8n Credentials",
"type": "main",
"index": 0
}
]
]
},
"When clicking ‘Test workflow’": {
"main": [
[
{
"node": "Globals",
"type": "main",
"index": 0
}
]
]
}
}
}
功能特点
- 自动检测新邮件
- AI智能内容分析
- 自定义分类规则
- 批量处理能力
- 详细的处理日志
技术分析
节点类型及作用
- Manualtrigger
- Stickynote
- Set
- Httprequest
- Splitout
复杂度评估
配置难度:
维护难度:
扩展性:
实施指南
前置条件
- 有效的Gmail账户
- n8n平台访问权限
- Google API凭证
- AI分类服务订阅
配置步骤
- 在n8n中导入工作流JSON文件
- 配置Gmail节点的认证信息
- 设置AI分类器的API密钥
- 自定义分类规则和标签映射
- 测试工作流执行
- 配置定时触发器(可选)
关键参数
| 参数名称 | 默认值 | 说明 |
|---|---|---|
| maxEmails | 50 | 单次处理的最大邮件数量 |
| confidenceThreshold | 0.8 | 分类置信度阈值 |
| autoLabel | true | 是否自动添加标签 |
最佳实践
优化建议
- 定期更新AI分类模型以提高准确性
- 根据邮件量调整处理批次大小
- 设置合理的分类置信度阈值
- 定期清理过期的分类规则
安全注意事项
- 妥善保管API密钥和认证信息
- 限制工作流的访问权限
- 定期审查处理日志
- 启用双因素认证保护Gmail账户
性能优化
- 使用增量处理减少重复工作
- 缓存频繁访问的数据
- 并行处理多个邮件分类任务
- 监控系统资源使用情况
故障排除
常见问题
邮件未被正确分类
检查AI分类器的置信度阈值设置,适当降低阈值或更新训练数据。
Gmail认证失败
确认Google API凭证有效且具有正确的权限范围,重新进行OAuth授权。
调试技巧
- 启用详细日志记录查看每个步骤的执行情况
- 使用测试邮件验证分类逻辑
- 检查网络连接和API服务状态
- 逐步执行工作流定位问题节点
错误处理
工作流包含以下错误处理机制:
- 网络超时自动重试(最多3次)
- API错误记录和告警
- 处理失败邮件的隔离机制
- 异常情况下的回滚操作